#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
using namespace std;
bool MEM;
using ll=long long;
using ld=long double;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
const int I=1e9,N=3e5+7;
const ll J=1e18;
int n,rt,a,b;
int dep[N],fa[N],dfn[N],cnn,dfm[N],co[N],st[N],tp;
vector<int> e[N],e1[N],to[N],de[N];
void dfs(int p,int f)
{
	dfn[p]=++cnn,co[cnn]=p,dep[p]=dep[f]+1,de[dep[p]].pb(p);
	fa[p]=f,st[++tp]=p;
	if (tp>a) to[st[tp-a]].pb(p);
	for (int i:e[p]) if (i!=f) e1[p].pb(i),dfs(i,p);
	tp--,dfm[p]=cnn;
}
struct sgt
{
	int t[N<<2];
	void ini()
	{
		memset(t,60,sizeof(t));
	}
	void add(int x,int y,int z,int p=1,int l=1,int r=n)
	{
		if (x>y) return;
		if (x<=l&&r<=y) return t[p]=min(t[p],z),void();
		int mid=(l+r)>>1;
		if (x<=mid) add(x,y,z,p<<1,l,mid);
		if (y>mid) add(x,y,z,p<<1|1,mid+1,r);
	}
	int que(int x,int p=1,int l=1,int r=n)
	{
		if (l==r) return t[p];
		int mid=(l+r)>>1;
		if (x<=mid) return min(t[p],que(x,p<<1,l,mid));
		else return min(t[p],que(x,p<<1|1,mid+1,r));
	}
} T;
int mnn[N],f[N],g[N],t[N],tmp[N],is[N];
bool chk(int mid)
{
	T.ini();
	for (int i=1; i<=n; i++) t[i]=1e8,mnn[i]=i<=mid?dep[i]:I;
	for (int d=n; d; d--)
	{
		if (d+a-b<=n)
		{
			for (int p:de[d+a-b])
			{
				if (f[p]) t[p]=dep[p];
				else
				{
					t[p]=I;
					for (int i:e1[p]) t[p]=min(t[p],t[i]);
				}
				T.add(dfn[fa[p]]+1,dfn[p]-1,t[p]-dep[fa[p]]*2);
				T.add(dfm[p]+1,dfm[fa[p]],t[p]-dep[fa[p]]*2); 
				int len=e1[p].size(),sum=0,mus=0,le=0;
				for (int i=0,j=0; i<len; i++)
				{
					tmp[i]=1,is[i]=1;
					while (j<to[p].size()&&dfn[to[p][j]]<=dfm[e1[p][i]])
						tmp[i]&=g[to[p][j++]],is[i]=0;
					if (is[i]) tmp[i]=mnn[e1[p][i]]-dep[p]<=b,mus+=tmp[i];
					else sum+=tmp[i],le++;
				}
				for (int i=0; i<len; i++)
				{
					int w=0;
					if (!is[i])
					{
						if (sum-tmp[i]!=le-1);
						else if (le-1) w=1;
						else w|=mus||p<=mid;
					}
					else
					{
						if (sum!=le);
						else if (le) w=1;
						else w|=mus-tmp[i]||p<=mid;
					}
					if (w) T.add(dfn[e1[p][i]],dfm[e1[p][i]],-I);
				} 
			}
		}
		for (int p:de[d])
		{
			for (int i:e1[p]) mnn[p]=min(mnn[p],mnn[i]);
			if (to[p].size())
			{
				f[p]=1;
				for (int u:to[p])
				{
					int w=min(t[u]-dep[u],dep[u]+T.que(dfn[u]));
					if (w<=b) g[u]=1;
					else f[p]=0,g[u]=0;
				}
			}
			else f[p]=mnn[p]-dep[p]<=b;
		}
	}
	return f[rt];
}
bool ORY;
int main()
{
	freopen("nim.in","r",stdin);
	freopen("nim.out","w",stdout);
	scanf("%d%d%d%d",&n,&rt,&a,&b),cnn=0;
	if(a>b&&n>300) return 0;
	for (int i=1; i<=n; i++)
		e[i].clear(),e1[i].clear(),to[i].clear(),de[i].clear();
	for (int i=1,x,y; i<n; i++) scanf("%d%d",&x,&y),e[x].pb(y),e[y].pb(x);
	if (b>=a)
	{
		cout<<1;
		return 0;
	}
	dfs(rt,0);
	int l=1,r=n,mid,res=0;
	while (l<=r)
	{
		mid=(l+r)>>1;
		if (chk(mid)) res=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<res<<"\n";
	return 0;
}

